/**
 * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jfinal.plugin.activerecord.generator;

import java.io.Serializable;

import cn.moceit.auto.ViewBuilder;
import cn.moceit.util.Mc;
import cn.moceit.view.AbstractMVView;
import cn.moceit.view.MVViewCfg;

/**
 * ColumnMeta
 */
public class ColumnMeta implements Serializable, Comparable<ColumnMeta> {

	private static final long serialVersionUID = -1113914891280187914L;
	public String name; // 字段名
	public String javaType; // 字段对应的 java 类型
	public String attrName; // 字段对应的属性名

	// ---------

	/*
	 * -----------+---------+------+-----+---------+---------------- Field |
	 * Type | Null | Key | Default | Remarks
	 * -----------+---------+------+-----+---------+---------------- id |
	 * int(11) | NO | PRI | NULL | remarks here
	 */
	public String type; // 字段类型(附带字段长度与小数点)，例如：decimal(11,2)
	public String isNullable; // 是否允许空值
	public String isPrimaryKey; // 是否主键
	public String defaultValue; // 默认值
	public String remarks; // 字段备注
	private MVViewCfg viewCfg;
	private transient AbstractMVView view;
	private boolean isenum;

	public ColumnMeta() {
		// viewCfg = new MVViewCfg();
	}

	public AbstractMVView getView() {
		if (view == null) {
			if (viewCfg == null) {
				viewCfg = new MVViewCfg();
				viewCfg.setName(name);
				viewCfg.setJavaType(javaType);
			}
			view = ViewBuilder.build(viewCfg);
		}
		return view;
	}

	@Override
	public int hashCode() {
		int hashCode = Mc.getHashCode(name, javaType, isPrimaryKey, type);
		return hashCode;
	}

	@Override
	public boolean equals(Object obj) {
		return Mc.equal(this, obj, "name", "javaType", "attrName", "isPrimaryKey", "type");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getJavaType() {
		return javaType;
	}

	public void setJavaType(String javaType) {
		this.javaType = javaType;
	}

	public String getAttrName() {
		return attrName;
	}

	public void setAttrName(String attrName) {
		this.attrName = attrName;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getIsNullable() {
		return isNullable;
	}

	public void setIsNullable(String isNullable) {
		this.isNullable = isNullable;
	}

	public String getIsPrimaryKey() {
		return isPrimaryKey;
	}

	public void setIsPrimaryKey(String isPrimaryKey) {
		this.isPrimaryKey = isPrimaryKey;
	}

	public String getDefaultValue() {
		return defaultValue;
	}

	public void setDefaultValue(String defaultValue) {
		this.defaultValue = defaultValue;
	}

	public String getRemarks() {
		return remarks;
	}

	public void setRemarks(String remarks) {
		this.remarks = remarks;
	}

	public MVViewCfg getViewCfg() {
		if (viewCfg == null) {
			viewCfg = new MVViewCfg();
			viewCfg.setName(name);
			viewCfg.setJavaType(javaType);
		}
		return viewCfg;
	}

	public void setViewCfg(MVViewCfg viewCfg) {
		this.viewCfg = viewCfg;
	}

	public void setView(AbstractMVView view) {
		this.view = view;
	}

	public boolean getIsenum() {
		return isenum;
	}

	public boolean isIsenum() {
		return isenum;
	}

	public void setIsenum(boolean isenum) {
		this.isenum = isenum;
	}

	@Override
	public int compareTo(ColumnMeta cm) {
		if (cm == null) {
			return 1;
		} else if (cm.viewCfg == null) {
			return 1;
		} else if (viewCfg == null) {
			return -1;
		} else {
			if (viewCfg.getOrders() == cm.viewCfg.getOrders()) {
				return name.compareTo(cm.name);
			} else {
				return viewCfg.getOrders() - cm.viewCfg.getOrders();
			}
		}
	}

}
